home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / amoslist / amoslist.mar / 000138_amos-request@svcs1.digex.net_Thu Mar 20 19:07:18 1997.msg < prev    next >
Text File  |  1997-04-01  |  5KB  |  174 lines

  1. Received: from svcs1.digex.net (svcs1.digex.net [204.91.197.224])
  2.     by mail1.access.digex.net (8.8.5/8.8.5) with ESMTP id TAA21801
  3.     for <mcox@access.digex.net>; Thu, 20 Mar 1997 19:07:13 -0500 (EST)
  4. Received: (from daemon@localhost)
  5.     by svcs1.digex.net (8.8.5/8.8.5) id QAA20717
  6.     for amos-out; Thu, 20 Mar 1997 16:40:24 -0500 (EST)
  7. Received: from mail3.access.digex.net (mail3.access.digex.net [205.197.247.4])
  8.     by svcs1.digex.net (8.8.5/8.8.5) with ESMTP id QAA20708
  9.     for <amos-list@svcs1.digex.net>; Thu, 20 Mar 1997 16:40:22 -0500 (EST)
  10. Received: from vifa1.freenet.victoria.bc.ca (uv334@vifa1.freenet.victoria.bc.ca [199.60.222.1])
  11.     by mail3.access.digex.net (8.8.5/8.8.5) with ESMTP id QAA21990
  12.     for <amos-list@access.digex.net>; Thu, 20 Mar 1997 16:40:19 -0500 (EST)
  13. Received: (from uv334@localhost) by vifa1.freenet.victoria.bc.ca (8.7.5/8.7.3) id NAA24163; Thu, 20 Mar 1997 13:40:06 -0800 (PST)
  14. Date: Thu, 20 Mar 1997 13:40:04 -0800 (PST)
  15. From: John Bintz <uv334@freenet.victoria.bc.ca>
  16. Sender: John Bintz <uv334@freenet.victoria.bc.ca>
  17. Reply-To: John Bintz <uv334@freenet.victoria.bc.ca>
  18. Subject: Re: bending walls! objects?
  19. To: Lee S Howarth <L.S.Howarth@cms.salford.ac.uk>
  20. cc: amos-list@access.digex.net
  21. In-Reply-To: <80256460.004096A2.00@cms-notes-a.salford.ac.uk>
  22. Message-ID: <Pine.3.89.9703201214.A16311-0100000@vifa1>
  23. MIME-Version: 1.0
  24. Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
  25. Content-Transfer-Encoding: 8bit
  26. X-MIME-Autoconverted: from QUOTED-PRINTABLE to 8bit by svcs1.digex.net id QAA20713
  27. Status: RO
  28. X-Status: 
  29.  
  30. Here is the code direct from my raycaster.  Here's how it works...
  31.  
  32.   *  Object      1-Y Distance from You-Object (Have)        
  33.   |\             2-X Distance from You-Object (Have)
  34.   | \            3-Real Distance from You-Object (Need)
  35.   |  \           4-Angle From You-Object, North being 0� (Need)
  36.  1|   \3
  37.   |    \
  38.   |    4\
  39.   |______#  You
  40.      2
  41.  
  42. You can use Atan(Y/X) to get the Angle, and then Side1/Sin(Ang) or
  43. Side2/Cos(Ang) to get the distance.  The Pythagorean Theorem (S1�+S2�=S3�) is
  44. too slow for a raycaster, but this isn't much better...
  45.  
  46. Procedure ENEMY
  47.   '
  48.   'A good bit of trig is used here.  For the next version, I will
  49.   'create a fast Fixed Point Atan() function, but that can wait. 
  50.   '
  51.   CORDER=-1
  52.   For I=0 To MXENEMY
  53.     EXDIST#=ENEMY(I,0)-CURRX
  54.     EYDIST#=ENEMY(I,1)-CURRY
  55.     DX=Int(EXDIST#) : DY=Int(EYDIST#)
  56.     If DY=0
  57.       If DX>0
  58.         ENEMYANG#=90
  59.       Else 
  60.         ENEMYANG#=-90
  61.       End If 
  62.       HYP=Abs(DX)
  63.     Else 
  64.       If DX=0
  65.         If DY<0
  66.           ENEMYANG#=0
  67.         Else 
  68.           ENEMYANG#=180
  69.         End If 
  70.         HYP=Abs(DY)
  71.       Else 
  72.         XX#=Abs(EXDIST#) : XY#=Abs(EYDIST#)
  73.         ENEMYANG#=Abs(Atan(XY#/XX#))
  74.         D=Int(ENEMYANG#)
  75.         If EXDIST#>0
  76.           If EYDIST#>0
  77.             ENEMYANG#=ENEMYANG#+90
  78.           Else 
  79.             ENEMYANG#=90-ENEMYANG#
  80.           End If 
  81.         Else 
  82.           If EYDIST#<0
  83.             ENEMYANG#=ENEMYANG#-90
  84.           Else 
  85.             ENEMYANG#=(90-ENEMYANG#)-180
  86.           End If 
  87.         End If 
  88.         ENANG=Int(ENEMYANG#)
  89.         ENANG=(ENANG+360) mod 360
  90.         GTCOS[CANG((ENANG+360) mod 360)] : UCOS=Param
  91.         If UCOS=0
  92.           HYP=Abs(DX#)
  93.         Else 
  94.           HYP=Abs((XY#*32767)/UCOS)
  95.         End If 
  96.       End If 
  97.     End If 
  98.     ENANG=Int(ENEMYANG#)
  99.     ENANG=(ENANG+360) mod 360
  100.     X#=CENTANG : Y#=ENEMYANG#
  101.     If CENTANG>180
  102.       X#=CENTANG-360
  103.     End If 
  104.     VANG#=Y#-X#
  105.     FX=-1
  106.     If VANG#>-30 and VANG#<30
  107.       ENANG=Int(VANG#)
  108.       XWHERE=((VANG#+30)*320)/60
  109.       If XWHERE>-1 and XWHERE<320
  110.         ZBUFF=Deek(Start(13)+(XWHERE*2))+5
  111.         If ZBUFF>HYP
  112.           FX=1000/(HYP+1)
  113.           If FX<100 and FX>1
  114.             Inc CORDER
  115.             EORDER(CORDER,0)=I
  116.             EORDER(CORDER,1)=FX
  117.             EORDER(CORDER,2)=XWHERE
  118.           End If 
  119.         End If 
  120.       End If 
  121.     End If 
  122.     ENWEAP(I,0)=XWHERE-4
  123.     ENWEAP(I,1)=FX
  124.     ENWEAP(I,2)=XWHERE+FX+4
  125.   Next 
  126.   If CORDER>-1
  127.     If CORDER=0 and FX>1 and FX<100
  128.       YWHERE=100+FX
  129.       YTOP=100-FX
  130.       XSIZE=FX
  131.       If ENEMY(EORDER(0,0),2)=$FFFF
  132.         SX=160
  133.       Else 
  134.         SX=128
  135.       End If 
  136.       Zoom 7,SX,0,SX+31,31 To 6,0,0,FX,FX*2
  137.       Screen 6 : Get Block 1,0,0,FX,FX*2,1
  138.       Screen 0 : Put Block 1,XWHERE+XSIZE-(FX/2),YTOP
  139.     Else 
  140.       For I=0 To CORDER
  141.         DIST=$FFFF
  142.         For J=0 To CORDER
  143.           If EORDER(J,1)<DIST
  144.             DIST=EORDER(J,1) : WHICH=J
  145.           End If 
  146.         Next 
  147.         FX=DIST
  148.         XWHERE=EORDER(WHICH,2)
  149.         YWHERE=100+FX
  150.         YTOP=100-FX
  151.         XSIZE=FX
  152.         If ENEMY(EORDER(WHICH,0),2)=$FFFF
  153.           SX=160
  154.         Else 
  155.           SX=128
  156.         End If 
  157.         Zoom 7,SX,0,SX+31,31 To 6,0,0,FX,FX*2
  158.         Screen 6 : Get Block 1,0,0,FX,FX*2,1
  159.         Screen 0 : Put Block 1,XWHERE+XSIZE-(FX/2),YTOP
  160.         EORDER(WHICH,1)=$FFFF
  161.       Next 
  162.     End If 
  163.   End If 
  164. End Proc
  165.  
  166.  
  167. #@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@
  168.         John C. Bintz - * uv334@freenet.victoria.bc.ca *
  169. @#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#*@#
  170. Come Visit Internext Software - the home of great Amiga software!
  171.     http://www.dragonfire.net/~JohnBintz/inext/inextsoft.html
  172. *#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#@*#
  173.  
  174.